<?php
/**
 * Classe que contem o estado (campos) da tabela teste
 * 
 * @package Application_Model
 * @name Application_Model_Teste
 * @author pablolopesk8
 */
class Application_Model_Teste
{
	/**
	 * Campos da tabela teste
	 * @access protected
	 */
	protected $id;
	protected $descricao;
	
	/**
	 * Metodo construtor da classe. Seta os campos da mesma atraves do metodo responsavel
	 * 
	 * @param array $options array nome=>valor dos campos
	 */
	public function __construct(array $options = null)
	{
		// Se for um array de campos, chama o metodo para seta-los
		if (is_array($options)) {
			$this->setOptions($options);
		}
	}
	
	/**
	 * Metodo responsavel por setar todos os campos a partir de um array
	 * 
	 * @param array $options array nome=>valor dos campos
	 */
	public function setOptions(array $options)
	{
		// Recupera todos os metodos da classe
		$methods = get_class_methods($this);
		
		// Percorre o array de campos e de acordo com o nome chama o respectivo metodo set
		foreach ($options as $key => $value) {
			$method = 'set' . ucfirst($key);
			
			if (in_array($method, $methods)) {
				$this->$method($value);
			}
		}
		
		// Retorna o objeto com os atributos definidos
		return $this;
	}
	
	/**
	 * Metodo magico __set
	 * 
	 * @param string $name nome do atributo a ser setado
	 * @param string|int $value valor do atributo a ser setado
	 * @throws Exception
	 */
	public function __set($name, $value)
    {
        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Propriedade invalida de Teste.');
        }
        $this->$method($value);
    }
    
    /**
     * Metodo magico __get
     * 
     * @param string $name nome do atributo a ser recuperado
     * @throws Exception
     */
    public function __get($name)
    {
        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Propriedade invalida de Teste.');
        }
        return $this->$method();
    }
	
    /**
     * Metodo para setar o id
     * 
     * @param int $id
     * @return Application_Model_Teste
     */
	public function setId($id)
	{
		$this->id = $id;
		return $this;
	}
	
	/**
	 * Metodo para recuperar o id
	 * 
	 * @return int|string
	 */
	public function getId()
	{
		return $this->id;
	}
	
	/**
	 * Metodo para setar a descricao
	 * 
	 * @param string $descricao
	 * @return Application_Model_Teste
	 */
	public function setDescricao($descricao)
	{
		$this->descricao = $descricao;
		return $this;
	}
	
	/**
	 * Metodo para recuperar a descricao
	 * 
	 * @return string
	 */
	public function getDescricao()
	{
		return $this->descricao;
	}
}